Vue.jsとCustom Elementsの関係性について
実際の使用例
https://gyazo.com/51a182f6b9bf3c266eaa65d41434b1b2
https://gyazo.com/474e1423dc198e6fc5805c9349688c20
使うためには設定をいれる必要がある
app.config.compilerOptions.isCustomElement = (tag) => tag.includes('-')
code:vite.config.js
export default {
plugins: [
vue({
template: {
compilerOptions: {
isCustomElement: (tag) => tag.includes('-')
}
}
})
]
}
拡張子をce.vueで定義する
code:ts
import { defineCustomElement } from 'vue';
import Example from './Example.ce.vue';
console.log(Example.styles); // inlined css */"
// カスタム要素のコンストラクタに変換
const ExampleElement = defineCustomElement(Example);
// 登録
customElements.define('my-example', ExampleElement);
3.5では、defineCustomElement() APIに関連する多くの長年の問題が修正され、Vueでカスタム要素をオーサリングするための多くの新機能が追加されました。
Custom Elementsのhost要素とShadow rootにアクセスするためのuseHost()、useShadowRoot()、this.$host APIを追加しました code:ts
import MyElement from './MyElement.ce.vue';
defineCustomElements(MyElement, {
shadowRoot: false,
nonce: 'xxx',
configureApp(app) {
app.config.errorHandler = ...
}
});
useShadowRoot()ヘルパー
custom-element: useHost() helper (775103a) useHost()ヘルパー
this.$hostを作成
ネストされたコンポーネントのスタイルをshadow rootに継承させる
code:ts
import { defineCustomElement } from 'vue'
import Root from './Root.ce.vue'
customElements.define('my-el', defineCustomElement(Root))
code:html
<!-- Root.ce.vue -->
<script setup>
import Child from './Child.ce.vue'
</script>
code:html
<!-- Child.ce.vue -->
<style>
div { color: red }; /* will be injected to Root.ce.vue's shadow root */
</style>
custom-element: support configurable app instance in defineCustomElement (6758c3c), closes #4356 #4635 defineCustomElement()にconfigureApp設定を追加
custom-element: support css :host selector by applying css vars on host element (#8830) (03a9ea2), closes #8826 :hostをサポート
custom-element: support emit with options (e181bff), closes #7605 最初のイベント引数がオブジェクトである場合、それはCustomEventのオプションオブジェクトとして使用される
引数リスト全体は CustomEvent の detail プロパティを通して公開される
code:js
emit('event', { bubbles: true })
defineCustomElementにexposeをサポート
custom-element: support nonce option for injected style tags (bb4a02a), closes #6530 nonceオプションをサポート
custom-element: support passing custom-element-specific options via 2nd argument of defineCustomElement (60a88a2) defineCustomElementの第2引数にCustomElementOptionsを渡せるように
custom-element: support shadowRoot: false in defineCustomElement() (37d2ce5), closes #4314 #4404 shadowRoot: falseをサポート
Evan Youが大半を修正してくれてるけどモチベーションがなんなのかきになったyamanoku.icon 今残ってるIssue
CSSでの@import や background-imageのパスが解決しない問題
ループ内のスロット・コンテンツが、v-for分だけレンダリングされ、v-for分だけ置換される。 code:html
<template>
<slot name="root">Replace me</slot>
</div>
</template>
#6309関連あるかな
事例